]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
WorkspacesView: fix removal of workspaces that are not at the end
authorGiovanni Campagna <gcampagna@src.gnome.org>
Fri, 3 Jan 2014 18:04:06 +0000 (19:04 +0100)
committerGiovanni Campagna <gcampagna@src.gnome.org>
Fri, 3 Jan 2014 21:46:45 +0000 (22:46 +0100)
Workspaces can removed from any index, and in particular they
will be removed by the WorkspaceTracker if they stop containing
windows at some point. Make sure WorkspacesView is not confused
and destroyes the right Workspace objects.

https://bugzilla.gnome.org/show_bug.cgi?id=721417

js/ui/workspacesView.js

index 997d1a8b8dc07d2f1c558f50e02a6f9ebeefbbf1..1d0982b7988a64a3a70b16c5b6fc7d4ba764e98c 100644 (file)
@@ -237,29 +237,32 @@ const WorkspacesView = new Lang.Class({
     },
 
     _updateWorkspaces: function() {
-        let oldNumWorkspaces = this._workspaces.length;
         let newNumWorkspaces = global.screen.n_workspaces;
 
         this.scrollAdjustment.upper = newNumWorkspaces;
 
-        if (newNumWorkspaces > oldNumWorkspaces) {
-            for (let w = oldNumWorkspaces; w < newNumWorkspaces; w++) {
-                let metaWorkspace = global.screen.get_workspace_by_index(w);
-                let workspace = new Workspace.Workspace(metaWorkspace, this._monitorIndex);
-                this._workspaces.push(workspace);
+        let needsUpdate = false;
+        for (let j = 0; j < newNumWorkspaces; j++) {
+            let metaWorkspace = global.screen.get_workspace_by_index(j);
+            let workspace;
+
+            if (j >= this._workspaces.length) { /* added */
+                workspace = new Workspace.Workspace(metaWorkspace, this._monitorIndex);
                 this.actor.add_actor(workspace.actor);
+                this._workspaces[j] = workspace;
+            } else  {
+                workspace = this._workspaces[j];
+
+                if (workspace.metaWorkspace != metaWorkspace) { /* removed */
+                    workspace.destroy();
+                    this._workspaces.splice(j, 1);
+                } /* else kept */
             }
-
-            if (this._fullGeometry)
-                this._updateWorkspaceActors(false);
-        } else if (newNumWorkspaces < oldNumWorkspaces) {
-            let nRemoved = (newNumWorkspaces - oldNumWorkspaces);
-            let removed = this._workspaces.splice(oldNumWorkspaces, nRemoved);
-            removed.forEach(function(workspace) {
-                workspace.destroy();
-            });
         }
 
+        if (this._fullGeometry)
+            this._updateWorkspaceActors(false);
+
         this._syncGeometry();
     },